package com.cskaoyan.controller;

import com.cskaoyan.bean.BasePageInfo;
import com.cskaoyan.bean.BaseRespVo;
import com.cskaoyan.bean.MarketBrand;
import com.cskaoyan.bean.param.CommonData;
import com.cskaoyan.service.BrandService;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;

/**
 * 品牌制造商Controller
 * 后台系统 → 商场管理 → 品牌制造商
 *
 * @author Chen_Feng
 * @since 2022/06/26 09:57
 */
@RestController
@RequestMapping("admin/brand")
public class BrandController {

    @Autowired
    BrandService brandService;

    /**
     * 查询
     * 点击 [后台系统 → 商场管理 → 品牌制造商] 会获取所有品牌商信息，
     * 此外点击搜索栏会根据输入信息进行模糊搜索，同时也会按照页面的限定
     * 来获取指定范围的数据，最后将数据进行封装并返回
     * <p>
     * 对于搜索条件中的id与name，会删除掉开头与结尾的空格，以达到更好的搜索效果
     *
     * @param basePageInfo 页面限定信息
     * @param id           精确查询时用到的id
     * @param name         模糊查询用到的name
     * @return com.cskaoyan.bean.BaseRespVo<com.cskaoyan.bean.MarketBrand>
     * @author Chen_Feng
     * @since 2022/06/26 10:04
     */
    @RequiresPermissions(value = {"admin:brand:list", "*"}, logical = Logical.OR)
    @RequestMapping("list")
    public BaseRespVo<MarketBrand> list(BasePageInfo basePageInfo, String id, String name) {

        // 对参数进行基本校验与处理
        Integer validId = null;
        if (id != null && !(id = id.trim()).isEmpty()) {
            if (!id.matches("\\d{7}")) {
                // id不是七位的数字，返回参数错误
                return BaseRespVo.invalidParameter("搜索的id应该为7位的数字");
            }
            validId = Integer.valueOf(id);
        }
        if (name != null) {
            name = name.trim();
            if (name.isEmpty()) {
                name = null;
            }
        }

        // 此处得到的id与name一定是符合要求的，调用Service业务
        CommonData<MarketBrand> data = null;
        try {
            data = brandService.getBrandByPageAndIdAndName(basePageInfo, validId, name);
        } catch (Exception e) {
            e.printStackTrace();
            return BaseRespVo.invalidData("数据获取异常");
        }

        // 返回响应
        return BaseRespVo.ok(data);
    }

    /**
     * 增加
     * 增加新的品牌制造商，并返回自增主键、增加时间与更新时间
     *
     * @param marketBrand 封装有品牌制造商名称、描述和图片url等信息的对象
     * @return com.cskaoyan.bean.BaseRespVo<com.cskaoyan.bean.MarketBrand>
     * @author Chen_Feng
     * @since 2022/06/26 17:45
     */
    @RequiresPermissions(value = {"admin:brand:create", "*"}, logical = Logical.OR)
    @RequestMapping("create")
    public BaseRespVo<MarketBrand> create(@RequestBody MarketBrand marketBrand) {

        // 名称数据校验
        String name = marketBrand.getName();
        if (name == null || name.trim().isEmpty()) {
            return BaseRespVo.invalidParameter("品牌商名称不能为空或纯空格");
        }
        if (brandService.isBrandExist(marketBrand)) {
            return BaseRespVo.invalidParameter("该品牌商名称已存在");
        }

        /*
        // 底价正则校验
        BigDecimal unknownFloorPrice = marketBrand.getFloorPrice();
        if (unknownFloorPrice == null) {
            return BaseRespVo.invalidParameter("底价不能为空");
        }
        String strFloorPrice = unknownFloorPrice.toString();
        if (!strFloorPrice.matches("\\d+(\\.\\d+)?")) {
            return BaseRespVo.invalidParameter("底价输入有误，仅支持非负数");
        }
        */

        // 底价正则校验
        String unknownFloorPrice = marketBrand.getFloorPrice();
        if (unknownFloorPrice == null) {
            return BaseRespVo.invalidParameter("底价不能为空");
        }
        if (!unknownFloorPrice.matches("\\d+(\\.\\d+)?")) {
            return BaseRespVo.invalidParameter("底价输入有误，仅支持非负数");
        }

        // 执行Service层操作
        try {
            MarketBrand returnMarketBrand = brandService.addBrand(marketBrand);
            return BaseRespVo.ok(returnMarketBrand);
        } catch (Exception e) {
            e.printStackTrace();
            return BaseRespVo.invalidData("数据保存失败");
        }
    }

    /**
     * 修改
     * 对编辑品牌制造商后提交的数据进行保存更新
     *
     * @param marketBrand 封装有品牌制造商相关信息数据的对象
     * @return com.cskaoyan.bean.BaseRespVo<com.cskaoyan.bean.MarketBrand>
     * @author Chen_Feng
     * @since 2022/06/26 19:27
     */
    @RequiresPermissions(value = {"admin:brand:update", "*"}, logical = Logical.OR)
    @RequestMapping("update")
    public BaseRespVo<MarketBrand> update(@RequestBody MarketBrand marketBrand) {
        // 名称正则校验
        if (marketBrand.getName() == null || marketBrand.getName().trim().isEmpty()) {
            return BaseRespVo.invalidParameter("品牌商品名称不能为空或纯空格");
        }

        // 底价正则校验
        String unknownFloorPrice = marketBrand.getFloorPrice();
        if (unknownFloorPrice == null) {
            return BaseRespVo.invalidParameter("底价不能为空");
        }
        if (!unknownFloorPrice.matches("\\d+(\\.\\d+)?")) {
            return BaseRespVo.invalidParameter("底价输入有误，仅支持非负数");
        }

        // 执行Service层操作
        try {
            MarketBrand returnMarketBrand = brandService.updateBrand(marketBrand);
            return BaseRespVo.ok(returnMarketBrand);
        } catch (Exception e) {
            e.printStackTrace();
            return BaseRespVo.invalidData("数据保存失败");
        }
    }

    /**
     * 删除
     * 删除指定的品牌制造商，实则是将该条数据的删除状态置为true，
     * 即不可见，非真正的删除
     *
     * @param marketBrand 封装了要删除的品牌制造商信息的对象
     * @return com.cskaoyan.bean.BaseRespVo
     * @author Chen_Feng
     * @since 2022/06/27 9:16
     */
    @RequiresPermissions(value = {"admin:brand:delete", "*"}, logical = Logical.OR)
    @RequestMapping("delete")
    public BaseRespVo delete(@RequestBody MarketBrand marketBrand) {
        // 数据校验
        Integer id = marketBrand.getId();
        if (id == null) {
            return BaseRespVo.invalidParameter("参数错误");
        }

        // 执行Service层操作
        try {
            boolean flag = brandService.deleteBrand(marketBrand);
            if (flag) {
                return BaseRespVo.ok(null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return BaseRespVo.invalidData("删除失败");
    }
}
